计划阅读调试下Dubbo的源码,结合官方源码分析Dubbo,自身再分析总结
本文对应的Dubbo 服务导出
源码分析
接上一节,继续介绍doExportUrls
1 | "unchecked", "rawtypes"}) ({ |
1 | <dubbo:registry address="${zookeeper_url}" client="curator2" |
1 | protected List<URL> loadRegistries(boolean provider) { |
上面的逻辑主要初始化register列表,用于后续的对每个协议都要暴露服务
后续将进行服务URL的组装以及服务的本地暴露和远程暴露
1 | private void doExportUrlsFor1Protocol(ProtocolConfig protocolConfig, List<URL> registryURLs) { |
上面代码介绍了导出服务中组装URL的部分,主要是对各个根据配置参数以及系统参数组装dubbo URL
1 | // 此为doExportUrlsFor1Protocol后半部分 |
上面代码可以看出来核心部分在生成Invoker部分,是后续导出服务的前提
1 | public class JavassistProxyFactory extends AbstractProxyFactory { |
从上面代码来看,getInvoker代码比较简单,主要逻辑在生成包装类
1 | public static Wrapper getWrapper(Class<?> c) { |
上面的代码主要是缓存的操作。生成类在makeWrapper中。makeWrapper方法比较复杂
1 | private static Wrapper makeWrapper(Class<?> c) { |
上面的代码用来生成Wrapper类,Wrapper类主要将接口中方法的信息都储存起来,通过解析getter setter is方法获得属性。
但我们目前主要关心的invokeMethod方法。debug之后可以看出来invokeMethod对应的源码,主要是根据接口中方法类型的不同来选择调用接口中不同的方法。
javassist不是本文重点,暂不介绍。
1 | //配置为none不暴露 |
回顾之前的代码,导出服务时首先导出本地服务,之后根据register信息导出远程服务
1 | private void exportLocal(URL url) { |
对于Injvm本地导出只是简单的生成一个InjvmExporter即可
1 |
|
重点关注需要注册的协议。进入RegisterProtocol中
1 |
|
跟着主流程走,第一步是导出服务,进入doLocalExport中,
1 | private <T> ExporterChangeableWrapper<T> doLocalExport(final Invoker<T> originInvoker) { |
默认的协议为Dubbo,进入DubboProtocol中
1 |
|
继续进入openServer
1 | private void openServer(URL url) { |
之后进入Exchangers#bind
中,
1 | public static Server bind(URL url, ChannelHandler... handlers) throws RemotingException { |
继续进入NettyTransporter
1 | public class NettyTransporter implements Transporter { |
可见bind函数就是创建了NettyServer,继续看下去,NettyServer继承了AbstractServer,主要逻辑在此构造函数以及子类doOpen模板方法中
1 |
|
上面就是暴露远程服务的过程了。
总结下来就是:
监听ContextRefreshEvent事件。在此方法中暴露服务
检查dubbo核心配置,并根据默认值或者系统值进行填充,同时组装URL
加载所有的注册信息
对每个协议注册到所有的注册中心上
- 根据核心配置组装map
- 获取invoker
- 暴露服务
在这个过程中涉及到几个核心接口
- Protocol 协议
1 | /** |
Transporter 传输层载体(TCP/UDP…)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
/**
* Transporter. (SPI, Singleton, ThreadSafe)
* <p>
* <a href="http://en.wikipedia.org/wiki/Transport_Layer">Transport Layer</a>
* <a href="http://en.wikipedia.org/wiki/Client%E2%80%93server_model">Client/Server</a>
*
* @see com.alibaba.dubbo.remoting.Transporters
*/
"netty") (
public interface Transporter {
/**
* Bind a server.
*
* @param url server url
* @param handler
* @return server
* @throws RemotingException
* @see com.alibaba.dubbo.remoting.Transporters#bind(URL, ChannelHandler...)
*/
({Constants.SERVER_KEY, Constants.TRANSPORTER_KEY})
Server bind(URL url, ChannelHandler handler) throws RemotingException;
/**
* Connect to a server.
*
* @param url server url
* @param handler
* @return client
* @throws RemotingException
* @see com.alibaba.dubbo.remoting.Transporters#connect(URL, ChannelHandler...)
*/
({Constants.CLIENT_KEY, Constants.TRANSPORTER_KEY})
Client connect(URL url, ChannelHandler handler) throws RemotingException;
}Exchanger 交换器
1 | /** |